문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 컴퓨터에서의 수 표현 (문단 편집) ====== 2의 보수[anchor(2의 보수)] ====== {{{+1 2's Complement}}} 1의 보수 방법에 1을 더하는 방법.[* 2의 보수 방법으로 이진수를 구하는 다른 방법도 있다. 오른쪽에서부터 1이 나올 때까지 그대로 둔 후, 1이 나오게 되면 그 다음부터 모든 자리를 반전시키는 방법이다. 예를 들어, -12를 이진수로 표현한다고 했을 때, 12의 이진수 표현인 001__1__00,,(2),,에서 맨 오른쪽부터 스캔하게 되면 밑줄친 1이 최초로 등장하는 1이고, 여기까지는 그대로 두고 그 다음 자리는 모두 반전하게 되면 110100,,(2),,가 되는데, 이게 바로 -12가 된다. 다른 예로 5 = 00010__1__,,(2),,라면, 밑줄친 1이 오른쪽에서 최초로 등장하는 1이므로, 그 1의 바로 왼쪽을 모두 반전한 111011,,(2),,가 바로 -5가 된다.] 즉 이진수 000011,,(2),, = +3의 비트를 모두 반전시켜 111100,,(2),,을 만들고, 여기에 1을 더해 111101,,(2),,로 -3을 표현하는 방법이다. 2의 보수 방법의 정확한 정의는 다음과 같다: > 총 n개의 비트로 정수를 표현할 때, 2^^n^^ = 1000...0,,(2),,에서 표현하고 싶은 음수의 절댓값을 뺀 수가 바로 2의 보수 방법으로 표현한 음수가 된다. 2의 보수 방법이라 부르는 이유가 여기에 있다. 결과적으로 어떤 음수를 2의 보수 방법으로 표현하고 싶다면 그 음수의 절대값의 모든 비트 숫자들을 반전시킨 후에(0 은 1로 반전, 1은 0으로 반전) 1을 더하면 된다. 즉, 1의 보수 방법에서 1을 더하는 과정이 추가된 것과 같다. 2의 보수 방법에서는 1의 보수 방법에서와 다르게 111...11,,(2),,이 의미하는 값이 -1을 의미하므로[* 1 = ...001,,(2),,를 2의 보수화하면 -1 = ...111,,(2),,가 된다.] 000...00,,(2),, = 0과 구분된다. 1의 부호 방법과 비교하면 양수에 음의 부호를 붙일 때 1을 더해주는 추가 연산을 해야하긴 하지만 이것이 그것이 2의 보수 방법에서 감수해야 하는 '''유일한''' 불편함이고, 양수를 빼는(음수를 더하는) 연산을 할 때 다른 추가 작업(예를 들면 end around carry를 처리)을 해줄 필요가 없고 다른 방법들과 달리 +0과 -0을 구별 안 해도 되므로 장점이 더 많다. 따라서 컴퓨터에서는 2의 보수 방법을 이용한 뺄셈 연산을 주로 채용하고 있다. [[파일:5-19-4.png|width=300]] 컴퓨터는 보통 2의 보수 방법과 부호화 절대치 방법으로 음수를 표현한다. 정수나 고정 소수점에서 2의 보수를 주로 사용하고, 부동 소수점의 유효숫자는 부호화 절대치 방법을 사용한다. 그림에서 처럼 시계 방향으로 증가하는 형태로 값을 나열할 수 있다. 이것이 바로 2의 보수 숫자 포맷이고 숫자의 표현 범위는 [math(-2^{n-1})]에서 [math(2^{n-1}-1)]까지가 된다. 여기서는 [math(n=4)]이기 때문에 [math(-8)]에서 [math(7)]까지가 표현 범위다. 부호 절대값(Signed Magnitude)이나 1의 보수(1's Complement), 부호 숫자(Signed Digit), 음의 기수(Negative Radix) 등의 방법들은 특정 회로에서 유용함이 입증되어 하드웨어 레벨에서 내부적으로 사용하는 경우가 있다.[* 예를 들면 부호 숫자(Signed Digit) 방법으로 수를 표현하면 덧셈 연산에서 받아올림이 발생하지 않는다는 장점을 이용해서 덧셈 연산을 많이 해야 하는 회로에서 부호 숫자를 사용한 고속 연산이 가능하다.] {{{signed int}}}의 범위는 다음과 같다. * 표현할 수 있는 수의 최솟값: 1000 0000 0000 0000 0000 0000 0000 0000,,(2),, (0x80000000) = -2147483648 * 표현할 수 있는 수의 최댓값: 0111 1111 1111 1111 1111 1111 1111 1111,,(2),, (0x7FFFFFFF) = 2147483647 * 이 두 수는 C언어의 limits.h 헤더 파일에 각각 {{{INT_MIN}}}, {{{INT_MAX}}}로 정의되어 있다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기